home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 8
/
Aminet 8 (1995)(GTI - Schatztruhe)[!][Oct 1995].iso
/
Aminet
/
util
/
pack
/
OptXPK.lha
/
OptimizeXPK.rexx
< prev
Wrap
OS/2 REXX Batch file
|
1995-02-24
|
4KB
|
189 lines
/* OptimizeXPK.rexx */
OPTIONS RESULTS
/* Change this to reflect where you have the "xpk" program installed */
XPK = "Arc:Xpk"
/* Change this to where you have GNU touch installed, */
/* or, if you don't have GNU touch -- or any other touch */
/* that supports reference files via a "-r" switch as a */
/*command line argument, leave it blank, as in: */
/* TOUCH = "" */
TOUCH = "bin:touch"
/* */
packers.0 = 4
packers.1 = "MASH"
packers.2 = "IMPL"
packers.3 = "RAKE"
packers.4 = "NUKE"
/*********************************************/
/* Don't change anything beyond this point, */
/* unless you really know what you're doing. */
/*********************************************/
CALL ADDLIB("rexxsupport.library", 0, -30, 0)
SAY "Starting to optimize at" TIME(CIVIL)
CALL TIME(RESET)
IF ARG(1,"Exists") THEN
DO
PARSE ARG msg
DO UNTIL msg=""
PARSE VAR msg first rest
msg=rest
CALL OptimizeDir(first)
END
END
ELSE
DO
CALL ADDLIB("rexxreqtools.library", 0, -30, 0)
CALL RTFILEREQUEST("", , "Pick files to pack", "_Pack", 'rtfi_flags = freqf_multiselect',files)
IF files == 1 THEN
DO j=1 TO files.count
CALL OptimizeDir(files.j)
END
END
secs=TIME(ELAPSED)
SAY "Done at" TIME(CIVIL)
SAY "Time elapsed:" secs"s"
EXIT 0
/********** OptimizeDir **********/
OptimizeDir: PROCEDURE EXPOSE XPK packers.
PARSE ARG filepath
filestats = STATEF(filepath)
PARSE VAR filestats filetype .
IF filetype="FILE" THEN
DO
CALL OptimizeFile(filepath)
END
ELSE IF filetype="DIR" THEN
DO
filelist = SHOWDIR(filepath,'FILE','0a'x)
IF LENGTH(filelist)>0 THEN CALL OptimizeDir_Helper(filepath,filelist)
filelist = SHOWDIR(filepath,'DIR','0a'x)
IF LENGTH(filelist)>0 THEN CALL OptimizeDir_Helper(filepath,filelist)
END
RETURN 0
/********** OptimizeDir_Helper **********/
OptimizeDir_Helper: PROCEDURE EXPOSE XPK packers.
PARSE ARG pathname,filelist
DO UNTIL filelist=""
PARSE VAR filelist first '0a'x rest
filelist=rest
testchar = RIGHT(pathname,1)
IF testchar==":" | testchar=="/" THEN
filepath = pathname||first
ELSE
filepath = pathname"/"first
CALL OptimizeDir(filepath)
END
RETURN 0
/********** OptimizeFile **********/
OptimizeFile: PROCEDURE EXPOSE XPK packers.
PARSE ARG filepath
divpos = MAX(LASTPOS(":", filepath), LASTPOS("/", filepath)) + 1
filename = SUBSTR(filepath, divpos)
tmpdir = "OptXPK:_"filename
original = tmpdir"/original"
ADDRESS COMMAND
'makedir' tmpdir
'copy' filepath original
XPK '>NIL:' '-e' original
filestats = STATEF(original)
PARSE VAR filestats . bytes blocks .
best.name = "original"
best.size = blocks
best.bytes = bytes
best.time = 0
SAY filepath "["blocks" blocks] "
IF blocks>1 THEN
DO i = 1 to packers.0
this = tmpdir"/"packers.i
'copy' original this
XPK '>NIL: -m' packers.i this
filestats = STATEF(this)
PARSE VAR filestats . bytes blocks .
CALL WRITECH(STDOUT, packers.i "["blocks"] ")
IF blocks < best.size THEN
DO
IF best.name~="original" THEN 'delete quiet' tmpdir"/"best.name
best.name = packers.i
best.size = blocks
best.bytes = bytes
best.time = ExtractionTime(this)
END
ELSE IF blocks = best.size THEN
DO
challenge = ExtractionTime(this)
IF best.time < challenge THEN
DO
'delete quiet' this
END
ELSE
DO
IF best.name~="original" THEN 'delete quiet' tmpdir"/"best.name
best.name = packers.i
best.bytes= bytes
best.time = challenge
END
END
ELSE
DO
'delete quiet' this
END
END
filestats = STATEF(filepath)
PARSE VAR filestats . bytes blocks .
IF best.size<=blocks THEN
DO
SAY "("best.name")"
dest = tmpdir"/"best.name
IF touch~="" THEN touch "-r" filepath dest
'copy dates' dest filepath
END
ELSE
SAY "()"
'delete quiet all' tmpdir
RETURN 0
/********** ExtractionTime **********/
ExtractionTime: PROCEDURE EXPOSE XPK tmpdir
PARSE ARG xpkfile
time_me = tmpdir"/time_me"
'copy' xpkfile time_me
CALL TIME(RESET)
XPK ">NIL:" '-e' time_me
te = TIME(ELAPSED)
'delete quiet' time_me
CALL WRITECH(STDOUT, "«"te"s» ")
PARSE VAR te secs "." jiffies .
RETURN 100 * secs + jiffies